/*duptest1.c*/
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<errno.h>

void main()
{
    int newfd, oldfd1, oldfd2, newfd2, nchar;
    char buf[30];

    // 打开文件 a.txt 以读写模式，如果文件不存在则创建它
    oldfd1 = open("a.txt", O_RDWR);
    // 打开文件 b.txt 以读写模式，如果文件不存在则创建它
    oldfd2 = open("b.txt", O_RDWR);

    // 打印 oldfd1 的文件描述符值
    if (oldfd1 > 0) printf("The oldfd1 file descriptor =%d\n", oldfd1);
    // 打印 oldfd2 的文件描述符值
    if (oldfd2 > 0) printf("The oldfd2 file descriptor =%d\n", oldfd2);

    // 使用 dup 函数复制 oldfd1，得到一个新的文件描述符 newfd
    newfd = dup(oldfd1);
    // 打印 newfd 的文件描述符值
    printf("The newfd file descriptor =%d\n", newfd);

    // 使用 dup2 函数将 oldfd1 复制到标准输入（文件描述符为 0），得到新的文件描述符 newfd2
    newfd2 = dup2(oldfd1, 0);
    // 检查 dup2 函数是否执行失败
    if (newfd2 == -1) {
        perror("dup2 failed\n");
        exit(0);
    }
    // 打印 newfd2 的文件描述符值
    printf("The newfd2 file descriptor =%d\n", newfd2);

    // 从 newfd2 对应的文件（即 a.txt）中读取最多 28 个字节的数据到 buf 数组中
    nchar = read(newfd2, buf, 28);
    // 检查 read 函数是否执行失败
    if (nchar == -1) {
        perror("read failed\n");
        exit(0);
    }
    // 在读取的数据末尾添加字符串结束符
    buf[nchar] = '\0';
    // 打印从 a.txt 中读取的数据
    printf("I have read from a.txt:%s\n", buf);
}